package com.nf.db.handlers;

import com.nf.db.DaoException;

import java.sql.ResultSet;
import java.sql.SQLException;

import static com.nf.db.handlers.RowProcessor.DEFAULT_ROWPROCESSOR;

public class ScalarHandler<T> implements ResultSetHandler<T> {
    //这里需要两个参数，一个是列索引，一个是列名，用作给客户使用时，来指定拿哪行数据
    private Integer columnIndex;
    private String cloumnName;

    //默认构造函数，默认拿第一行第一列
    public ScalarHandler() {
        this(1, null);
    }

    //指定索引的构造函数，通过传进来的索引来指定拿哪行数据
    public ScalarHandler(Integer columnIndex) {
        this(columnIndex, null);
    }

    //指定列名的构造函数，通过传进来的列名来指定拿哪行数据
    public ScalarHandler(String cloumnName) {
        this(null, cloumnName);
    }

    /*
    * 指定索引和列名的构造函数，通过传进来的索引和列名来指定拿哪行数据
    * 如果索引和列名都有值，这里默认以列名来拿值
    * */
    public ScalarHandler(Integer columnIndex, String cloumnName) {
        this.columnIndex = columnIndex;
        this.cloumnName = cloumnName;
    }

    @Override
    public T handle(ResultSet rs) {
        try {
            //判断这个1结果集是否有数据，如果没有数据，返回null
            if (!rs.next()) return null;
            return DEFAULT_ROWPROCESSOR.toScalar(rs, cloumnName, columnIndex);
        } catch (SQLException e) {
            throw new DaoException("结果集处理失败", e);
        }
    }
}
